package com.aikg.kgrag_java.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.aikg.kgrag_java.pojo.enums.RoleEnum;
import com.aikg.kgrag_java.pojo.request.LLMRequestBody;
import com.aikg.kgrag_java.service.ILLMService;
import com.aikg.kgrag_java.service.impl.LLMServiceImpl;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class LLMBaichuan2 {

    @Autowired
    ILLMService llmService;
    /**
     * 百川2-13B
     *
     * @param sentence 语音识别的句子
     */
    public  String Baichuan2Templete(String sentence) {
        String content = "Instruction:你需要根据我给你的句子，分析我需要的是哪种模板（模板类型：案例模板、总结报告模板）。注意：你只需要分类，不需要帮我写模板内容，也不要有额外的输出\\n"
                + "Examples:[{\"example\": \"我在写总结报告，给我一个模板\", \"output\": \"总结报告模板\"},{"
                + "\"example\": \"给我一个案例模板\", \"output\": \"案例模板\"},{"
                + "\"example\": \"总结报告怎么写\", \"output\": \"总结报告模板\"}]"
                + "text:\\n"
                + sentence;
        return QA(content);
    }

    /**
     * 百川2-13B
     *
     * @param loc NER结果的JSON
     * return ArrayList<Double>,列表顺序：最大纬度，最大经度，最小纬度，最小经度
     */
    public  ArrayList<Double> Baichuan2Conditions(String loc) {//转化条件
        if (loc.equals("")) {
            loc = "台湾海峡";
        }
        String content = loc + "的经纬度范围为多少？（输出格式：{\"latitude\":[纬度最小值,纬度最大值],\"longitude\":[经度最小值,经度最大值]}）";
        ArrayList<Double> result = new ArrayList<>();
        //1.调用大模型生成回复，切分出里面的json，正则表达式
        String jsonPattern = "\\{.*?\\}";
        String jsonString = loc.replaceAll(".*?(" + jsonPattern + ")", "$1");
        try {
            System.out.println(jsonString);
            JSONObject jsonObject = new JSONObject(jsonString);
            // 提取纬度数组
            JSONArray latitudeArray = jsonObject.getJSONArray("latitude");
            // 提取经度数组
            JSONArray longitudeArray = jsonObject.getJSONArray("longitude");
            //列表顺序：最大纬度，最大经度，最小纬度，最小经度
            result.add(FormatJson(latitudeArray.getString(1)));
            result.add(FormatJson(longitudeArray.getString(1)));
            result.add(FormatJson(latitudeArray.getString(0)));
            result.add(FormatJson(longitudeArray.getString(0)));
        } catch (Exception e) {
            e.printStackTrace();
        }
        if(result.isEmpty()){
            result.add(0.0);
            result.add(0.0);
            result.add(0.0);
            result.add(0.0);
        }
        return result;
    }

    /**
     * 经纬度的json值，string转double
     *
     * @param value string
     * @return double
     */
    private static Double FormatJson(String value){
        return Double.parseDouble(value.replace('°','.')
                .replace('度','.')
                .replace("N", "")
                .replace("S", "")
                .replace("E", "")
                .replace("W", "")
                .replace("'", "")
                .replace("\"", ""));
    }

    /**
     * 链接大模型，获取大模型的输出
     *
     * @param message 提示词
     * @return 大模型结果
     */
    public String QA(String message){
        LLMRequestBody llmRequestBody = new LLMRequestBody();
        llmRequestBody.addMessages(RoleEnum.USER, message);
        return llmService.chat(llmRequestBody);
    }

//    public static void main(String[] args) {
//        String loc = "结果是";
//        System.out.println(Baichuan2Conditions(loc));
//    }
}
